/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package uy.edu.ort.arqsw.servicios;


import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.*;
import org.apache.log4j.Logger;
import uy.edu.ort.arqsw.domino.EntradaBlog;
import uy.edu.ort.arqsw.domino.Tag;

/**
 *
 * @author victor
 */
@Stateless
public class EntradaBlogFacade implements EntradaBlogFacadeLocal {
    public static final Logger log = Logger.getLogger(EntradaBlogFacade.class);
    
    @PersistenceContext(unitName = "obligContenidoWeb-ejbPU")
    private EntityManager em;
    
    @Override
    public void crear(EntradaBlog entradablog) {
        log.debug("crear entradablog titulo=" + entradablog.getTitulo() + " autor=" + entradablog.getAutor() + " fecha=" + entradablog.getFecha().toString() + " contenido=" + entradablog.getContenido());
        
        ArrayList<Tag> listtag = (ArrayList<Tag>) entradablog.getTags();
        entradablog.setTags(new ArrayList<Tag>());
        
        for (Tag t_e : listtag) {
            Tag t1 = this.buscarTagPorValor(t_e.getValor());
            if (t1 == null){
                t1 = new Tag();
                t1.setValor(t_e.getValor());
                em.persist(t1);         
                em.flush();
            }
            em.persist(entradablog);
            entradablog.agregarTag(t1);
            em.flush();
        }
        
        em.persist(entradablog);
        em.flush();   
    }
    
    private Tag buscarTagPorValor(String unValor){   
        Tag ret = null;
        TypedQuery<Tag> query = em.createQuery("SELECT t FROM Tag t WHERE t.valor = ?1" , Tag.class);
        query.setParameter(1, unValor);
  
        try{
            ret = (Tag) query.setMaxResults(1).getSingleResult(); 
        } catch (NoResultException e){

        }
        return ret;
    }

    @Override
    public void editar(EntradaBlog entradaBlogOriginal, EntradaBlog entradaBlogModificada) {
        remover(entradaBlogOriginal);
        crear(entradaBlogModificada);
    }

    @Override
    public void remover(EntradaBlog entradablog) {
        Query query = em.createQuery("SELECT e FROM EntradaBlog e WHERE e.titulo = :titulo");
        query.setParameter("titulo", entradablog.getTitulo());
        
        EntradaBlog res_find = (EntradaBlog) query.setMaxResults(1).getSingleResult();
        
        em.remove(res_find);
    }

    @Override
    public List<EntradaBlog> buscar(Date fecha, String titulo, String autor, String contenido, Collection<Tag> tags) {
        if (fecha == null && titulo.equals("") && autor.equals("") && tags.isEmpty()) {
            return obtenerTodas();
        } else if (fecha == null && titulo.equals("") && autor.equals("")) {
            // buscar solo por tags aquí
            return new ArrayList<EntradaBlog>();
        } else {
            Query query;
            String strParametros = "";
            List<EntradaBlog> entradasAux;
            List<EntradaBlog> resultado = new ArrayList<EntradaBlog>();

            if (!titulo.equals("")) {
                strParametros += " e.titulo = :titulo";
            }
            if (fecha != null) {
                if (strParametros.equals("")) {
                    strParametros += " e.fecha = :fecha";
                } else {
                    strParametros += " and e.fecha = :fecha";
                }
            }
            if (!autor.equals("")) {
                if (strParametros.equals("")) {
                    strParametros += " e.autor = :autor";
                } else {
                    strParametros += " and e.autor = :autor";
                }
            }            
            if (!contenido.equals("")) {
                if (strParametros.equals("")) {
                    strParametros += " p.contenido = :contenido";
                } else {
                    strParametros += " and e.autor = :autor";
                }
            }
            
            String strQuery = "SELECT e FROM EntradaBlog e";            
            
            if (!strParametros.equals("")) {
                strQuery += " WHERE" + strParametros;                            
            }
            
            query = em.createQuery(strQuery);
            
            
            if (!titulo.equals("")) {
                query.setParameter("titulo", titulo);
            }
            if (fecha != null) {
                query.setParameter("fecha", fecha, TemporalType.DATE);
            }
            if (!autor.equals("")) {
                query.setParameter("autor", autor);
            }            
            if (!contenido.equals("")) {
                query.setParameter("contenido", contenido);
            }
            
            entradasAux = (List<EntradaBlog>)query.getResultList();
            
            // esto se hace porque no podemos hacer que el equals de Tag compare por Tag.Valor
//            for(EntradaBlog e : entradasAux) {
//                Boolean encontrado = false;
//                for(Tag t_e : e.getTags()) {
//                    for(Tag t_p : tags) {
//                        if (t_e.getValor().equals(t_p.getValor())) {
//                            encontrado = true;
//                            resultado.add(e);
//                            break;
//                        }
//                    }
//                    if (encontrado) {
//                        break;
//                    }
//                }
//            }
            
            return entradasAux;
        }
    }

    @Override
    public List<EntradaBlog> obtenerTodas() {
        Query query = em.createQuery("SELECT e FROM EntradaBlog e");
        
        return (List<EntradaBlog>) query.getResultList();
    }    
}
